教程 | 一辆听得懂指令的机器小车
当微控制器Wio Terminal遇上图形化编程平台Codecraft会擦出什么奇妙的火花呢?在社区小伙伴郭进强的“魔法加持”下,一台能够听懂指令的声控机器小汽车就诞生啦~
创作不易,开源即爱!点赞、转发、在看、留言支持创作者哟,超详细教程附上:
作|者|介|绍
郭进强Vincent Kok
SeeedStudio国际社区活跃用户,对技术充满热情,STEAM AI机器人倡导者。
应用Wio Terminal的内置麦克风和嵌入式机器学习,实现语音识别功能,从而让小车听懂行驶 (Go)、停止(Stop)两个指令,并识别背景噪音(Bacgkround Noise)。
在这个项目教程中,我将使用由矽递科技Seeed Studio研发的Wio Terminal的内置麦克风和支持嵌入式机器学习的图形化编程平台Codecraft制作了一个声控机器小汽车,从而实现小车能语音 识别行驶 (Go)、停止(Stop)两个指令,并识别背景噪音 Bacgkround Noise).
项目所使用的元器件与工具
• 矽递科技Wio Terminal
• 优必选uKit Explore Kit
• 矽递科技图形化编程软件平台Codecraft
• Edge Impulse Studio
• Arduino IDE
我们先一起看看这个项目的演示视频:
视频1:最终项目演示视频
图片1:用优必选uKit Explore Kit搭建的机器小车
Wio Terminal上的麦克风只能检测声音的强度(请下载或查看下方图纸,了解更多细节),因此要让它识别到不同的词是很有挑战的。但我想到了一些有创意的方法来捕捉声音来源,然后用Edge Impulse训练它们,看看它是否能够做简单的语音识别。稍后我们将看到结果。
图片2: Wio Terminal的麦克风示意图
好奇我怎么做到的吗?那接下来就一起跟着我的项目教程步骤,你也可以动手做出这个项目哟。
在这个项目教程里面,将会涵盖以下内容:
• 什么是UART串行通讯?
• 如何实现Wio Terminal和uKit Explore小车之间的UART串行通讯
• 第一步:使用Codecraft训练一个嵌入式机器学习的模型
• 第二步:Arduino文本编程优化
• 第三步:对uKit Explore小车(这个小车的主控是基于Arduino Mega 2560)进行编程
• 第四步:项目成果
什么是UART串行通讯?
UART英文全称Universal Asynchronous Receiver/Transmitter,翻译为中文是:通用异步收发传输器,是最通用的设备与设备间通讯的一种协议。这篇教程将与大家分享如何通过以下步骤将UART作为一个硬件通讯协议。
正确配置后,UART可以使用多种不同类型的串行协议,包括发送和接收串行数据。在串行通信中,数据是通过单根线实现字符的逐位传输。
通俗地说,UART可以让Arduino等嵌入式设备通过 TX(发送)和 RX(接收)线,将数据发送到另一个嵌入式设备上。具体传输图示,见下图参考:
图片3: UART技术原理图
图片来源:
https://learn.sparkfun.com/tutorials/serial-communication/all
我经常使用 UART 作为嵌入式设备之间的通信协议。让我再给大家分享一个案例。Arduino UNO本身没有内置WiFi,因此无法用它直接做跟物联网相关的项目。但随着我对基本 UART 串行通信的了解,我就开始用ESP8266/ESP32 作为 Arduino UNO 的协处理器,这样的话,Arduino UNO自带的传感器收集的数据就可以通过 ESP8266/ESP32发送到云平台,如 Web 服务器、Blynk 或 FAVORIOT。
在两个嵌入式设备(例如 Arduino UNO 和 ESP8266/ESP32)之间实现了传输数据之后,做项目的创意可能性就完全没有极限了!比如参考下方的例子,我试图在 TTGO T形显示屏(Serial2 线)和 uKit Explore(串行线)之间建立简单的串行通信。
图片4: TTGO T形显示屏与uKit Explore之间的串行通信图
接下来,我还会再详细介绍如何在这个声音控制小车项目中,实现这样的数据传输。
实现UART串行通讯
在Wio Terminal和uKit Explore小车之间实现UART串行通讯
根据Wio Terminal的官方文档显示,Wio Terminal的第8和10个引脚即为TX发送/ RX接收引脚。
图片5:Wio Terminal引脚信息图
而对于 uKit Explore小车来说,它具有与 Arduino UNO 引脚分配类似的接头,因此引脚 D0 和 D1即为TX/RX 引脚。你可以根据下图查看uKit Explore完整的引脚分配:https://ubtechedu.gitbook.io/ukit-explore/v/english/ukit-explore-quick-start/pinout
图片6:uKit Explore引脚信息图
因为这两个设备都有UART (TX/RX) 引脚,所以在它们之间实现UART串行通讯就不难了。
只要你按照下方的接线指示进行两个设备的连接,就可以实现了。
Wio Terminal第8引脚接 uKit Explore的0引脚(TXD接RXD)
Wio Terminal第10引脚接 uKit Explore的1引脚(RXD接TXD)
我会在第三步小车编程中, 详细解释软件编程如何实现。
第一步:使用Codecraft训练一个嵌入式机器学习的模型
在这个步骤,我们的目标是应用图形化编程平台Codecraft创建一个语音识别的嵌入式机器学习的模型。
1.1.0 创建和选择模型
请通过https://ide.tinkergen.com/(或文末点击“阅读原文”跳转).这个链接访问Codecraft在线编程平台。然后在“选择硬件进行编程”这个版块选择“支持嵌入式机器学习的Wio Terminal”
图片7:选择“支持嵌入式机器学习的Wio Terminal”
1.1.1 创建“内置麦克风识别唤醒词”模型
在左侧中部的标题栏中,点击“创建模型”按钮。然后选择右边“为嵌入式机器学习创建新模型”版块中的“内置麦克风识别唤醒词”选项。如下图,根据要求输入模型的名称。
图片8: 输入模型名称
1.2.0数据采集
点击“确认”按钮后,窗口会自动跳转到“数据采集”界面。
图片9:数据采集界面
1.2.1 默认标签
系统提供了3个默认标签:hi wio、background背景音和其他词。
图片10: 系统默认标签
如果你想使用其他标签,你可以直接修改。但你也可以直接使用这些标签。在这个项目中,我对其中两个默认标签进行了修改,如下所示:
• 将hi wio改成go“行驶”
• 将其他词改成stop“停止”
1.2.2 修改标签后进行数据采集和数据采集程序修改
点击"hi wio”标签,系统将提示你更改标签名称。我将标签重新命名为go“行驶”,然后单击“确定”
图片11: 重新命名标签
用同样的操作处理“other words”标签。现在你就可以看到,这个项目所使用的三个标签如下:
图片12: 重新命名后的标签
重要提示:你也一定要相应修改“默认数据采集代码”中的标签名称:
图片13: 在默认数据采集代码中修改标签1
图片14: 在默认数据采集代码中修改标签2
1.2.3 连接Wio Terminal并上传数据采集代码
使用 USB-C 线将 Wio Terminal连接到笔记本电脑。单击“上传”按钮,这样将上传默认的数据采集代码。通常,上传大约需要 10 秒钟。上传成功后,页面将出现一个弹出窗口,提示“上传成功”。
点击“好的”按钮关闭窗口,并返回到数据采集界面。
注意:
1)你需要下载“Codecraft助手”才能将Codecraft在线 IDE上连接Wio Terminal和上传代码。
2)对于网页版的 Codecraft,如果你没有安装或运行设备助手,你应该会收到下图中的提示消息,表示你尚未打开设备助手。在这种情况下,你可以查看点击下方这个链接来下载、安装“设备帮助”并了解其使用。
图片15: 如未安装设备助手,系统提示信息
1.2.4 数据采集
在上文中,你可以找到数据采集的详细步骤介绍。
你可以按照步骤介绍,并根据你前面修改的标签来进行数据采集。
可以特别注意以下事项:
• Wio Terminal的按键 (A, B, C)所在位置
• 动图 gif已被自动加速,实际变换可以稍微放慢。
• 请注意标红的提醒信息
• 将鼠标指向描述文档就可以获得更详细的信息
在给 3 个标签收集了样本数据后,数据采集这个步骤就完成了。在这个项目中,我为3个标签分别收集了 15 秒数据。
图片16: 数据采集完成时,编程界面
1.3模型训练与部署
点击“训练与部署”按钮,你就可以看到如下图所示的模型训练界面。
图片17: 点击左下角的“训练与部署”按钮
go、background 和 stop3个标签内采集的原始数据的波形如下图所示,你可以从“样本数据”这个选项卡中查看。
go
如果你观察go标签里面的数据波形,我的声音输入是“go, go, go!”在 5 秒的窗口中,我录制了两次,两次中间有大约 1 秒停顿。
图片18: go标签里面的数据波形
background
在标签“background背景音”中,我只需将 Wio Terminal拿在手上即可捕捉周围的噪声数据。因此,您可以看到声音输入电平不是 0,因为周围有一些噪音,例如风扇旋转声。
图片19: “background背景音”标签里面的数据波形
stop
对于标签“stop”,为了与“go”标签中数据的区分,我尝试将我的发音在最后的字母延长为“stoppppp…………”整体大约持续 3 秒钟。
图片20: 标签“stop”的数据波形
1.3.1选择神经网络和参数
选择合适的神经网络大小:有“小、中、大”3种可选,并设置以下参数
• 训练循环数(正整数)
• 学习频率(介于0到1之间)
• 最低置信度(介于0到1之间)
这个界面默认提供50个训练周期作为参数值,但准确度不是很好。因此,我将训练周期更改为 100。
图片21: 修改训练周期
1.3.2 开始训练模型
点击“开始训练”。当你单击“开始训练”时,窗口将显示“正在加载..”!这个时候,耐心等待训练完成即可!
“正在加载..”的持续时间取决于所选神经网络的大小(小、中、大)和训练周期数。神经网络规模越大,训练周期越多,需要的时间就越长。
你也可以通过查看“日志”来推断所需时间。在下图中,“Epoch: 68/500”表示训练总轮数为 500 轮,目前进行到第 68轮。
图片22:训练日志详情
加载完成后,你可以在“日志”中看到这个提示“训练模型完成”,界面上也会出现“模型训练报告”的选项卡。
图片23:日志中的“训练模型完成”提示
1.3.3 观察模型性能,选择最理想的模型
在“模型训练报告”窗口中,你可以观察到模型训练结果,包括模型的准确率、损失情况和性能。
如果训练效果不理想,你可以通过选择另一个大小的神经网络或调整参数后再重新训练,直到你得到一个令人满意的模型为止。如果更改参数后不起作用,你就可能需要返回到再前一个步骤,再次收集数据。
图片24:模型训练报告
我在训练过程中,因为我把训练周期设置为 100,所以我能够达到 100% 的模型准确率。
1.3.4 部署理想模型
在“模型训练报告”窗口确认完模型性能后,点击“模型部署”按钮
图片25:模型部署按钮
部署完成后,单击“确定”进入“编程”窗口,这是我们将模型部署到 Wio Terminal的最后一步。
图片26:模型部署后的确定按钮
1.4.编程和模型使用
好的,现在我们完成了模型的训练,以及使用 UART 通信协议将人工智能(在这个项目中特指机器学习)与机器小车(Robo Car)进行集成的有趣部分。
以下是Codecraft图形化编程平台上自带的示例代码:
图片27: Codecraft图形化编程平台的示例代码
我给大家解释一下这段代码具体的功能。为了便于理解,我将其分解为以下几点:
• 如前所述,我们使用 if-else 条件语句来评估每个标签数据的置信度。
• 如果“go”标签的置信度大于0.8(80%),我会在串口终端打印“1”。
• 如果“stop”标签的置信度大于0.8(80%),我会在串口终端打印“2”。
• 否则,如果“background”标签的置信度大于 0.8(80%),我将在串行终端上打印“0”。
简言之,先记住下面 3 个不同的条件即可:
“go" > 0.8,命令为'1'
“stop”> 0.8,命令为“2”
“background”。命令为“0”
在对 Wio Terminal的 TX/RX 引脚排列进行了一些研究后,我发现了以下规律:
• Wio Terminal的第8和第10引脚 分别为 TX/RX 引脚,可用于连接到另一设备(在我这个项目中就是uKit Explore小车)。
图片28:Wio Terminal引脚信息图
• 你从 40 针接头访问的串行线是 Serial1 而不是通常的 Serial,它基本上通过串行终端显示输出。
请一定要注意上面的 2 个重要发现,因为这将是我们项目的关键部分。
如果我们查看图形化编程代码相应的文本代码,你会发现Serial.print 并没有使用 Serial1 线。因此,我们就需要进行第二个大步骤,继续在 Arduino IDE 上进行编程,从而进行自定义。
图片29: 点击右上角查看文本代码
图片30: Serial.print 细节代码
2.0 Wio Terminal 代码在Arduino IDE上进行修改
在这个步骤中,我们首要目标是对 Arduino文本代码进行修改,让程序调用Serial1.println 而不是 Serial.println,这样数据就可以通过Wio Terminal的第8 和 10引脚上的 TX/RX 引脚进行传输。
2.1 Codecraft切换到文本代码编程界面并复制文本代码
图片31: Codecraft从图形代码切换到文本代码
在Codecraft的文本代码编程界面,按 CTRL + A 全选所有代码并复制所有代码。
打开 Arduino IDE,创建一个新文件,通过 CTRL+V 将代码粘贴到文件中。输入你想要的文件名称后,保存代码文件。
图片32: 将文本代码复制到Arduino IDE
2.2 复制 Edge Impulse TinyML Arduino 库
这个步骤的问题在于:要如何将在Codecraft 平台上包括训练好的模型数据在内的所有文件复制到Arduino IDE 上?
其实很简单,通过下面的步骤即可:
• 请通过以下路径访问这个文件夹:C:\Users\<User_Name>\AppData\Local\Programs\cc-assistant\resources\compilers\Arduino\contents\libraries
• 在里面找到与 Arduino 文本代码顶部的 Edge Impulse 头文件编号相同的文件夹名称(在我这个项目中,它的编号是 47606)
图片33: 文件夹截图
• 复制整个 ei-project_47606 文件夹并将其粘贴到C:\Users\<User_Name>\Documents\Arduino\libraries\
图片34: 复制后文件夹截图
2.3 对Serial.println函数进行修改
最后,我们可以在Arduino IDE中简单回顾一下代码,鼠标向下滚动到 void loop 部分并将 Serial.println 函数修改为 Serial1.println。
图片35:代码修改
2.4 代码烧录
到这,我们就可以把代码烧录到 Wio Terminal了。
烧录之前,确保你已安装 Wio Terminal支持包。如果你还没有安装,可以参考Seeed Wiki 上的“Wio Terminal入门”指南(https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/)。
此外,也一定要确保你选择了正确的板子和 COM 端口。
图片36: 代码烧录前,选择正确的板子和端口
好了,到此我们已经完成了所有文本代码所需要的修改!现在,以下3个条件所对应的命令“1”、“2”和“0”,就可以从Wio Terminal的第8和10引脚 上可用的 TX/RX 引脚发送出去了。
"go" > 0.8, 命令是 '1'
"stop" > 0.8, 命令是 '2'
"background". 命令是 '0'
3.0 对uKit Explore小车(这个小车的主控是基于Arduino Mega 2560)进行编程
在这个步骤中,我们将对我用uKit Explore搭好的机器小车进行编程。
3.1 uKit Explore 介绍
首先跟大家简单介绍下 uKit Explore。它是优必选开发的一个基于Arduino生态系统的机器人套件(核心芯片为Arduino 2560)。
“uKit Explore采用兼容Arduino的开源平台的主控制器,学习资源丰富”
图片37:uKit Explore 主板
在这个教程里面,我不会涉及到这个机器小车的结构搭建。如果对这部分内容感兴趣,你可以下载 uCode软件或前往 https://ide.ubtrobot.com/,在这里你可以找到我在这个项目中使用的机器小车的 3D构建说明。
图片38: uCode软件里面的机器小车结构搭建指南
3.2 对uKit Explore进行编程,读取UART数据
现在,我们需要对 小车进行编程,让它在接收到来自 Wio Terminal的命令“1”、“2”和“0”时,可以根据不同的条件采取相应的行动。
这里的关键概念是,如果串行线路包含任何数据,我们需要让 uKit Explore 持续监听串行线路。如果它确实包含串行数据,串行读取数据并将其分配给一个变量。最后一步是,我们让程序进行变量比较并执行不同的操作。
在这个项目中,当 uKit Explore 收到命令“1”(go)时,机器小车将向前移动;当 uKit Explore 收到命令 '2'(stop) 时,小车会停止;当 uKit Explore 接收到命令 '0'(background背景音)时,它也会停止。
图片39: 示例代码
3.3 上传代码
最后,我们将代码(请关注“柴火创客空间”公众号回复“代码”即可获得)上传到Wio Terminal。在啰嗦提醒一句:请确保你在上传前选择了正确的板卡和 COM 端口。
4.0项目成果
让我们快速看一下到目前为止我们取得的项目成果!
视频2:项目成果视频
如你所见,机器小车可以通过识别语音“'go, go, go'而往前行驶,并在识别到“stopppps....”或“background”后,自动停下。我们达到了一开始设定的目标!
小结
Codecraft(点击“阅读原文”跳转)是一个非常简单易上手并支持嵌入式机器学习的图形化编程工具,它可以训练一个简单的嵌入式机器学习模型,并将其与你的机器小车系统集成。如果你对这个教程感兴趣,那就赶快自己动手也做一个吧!
图片40:Codecraft软件
🤖️🤖️🤖️
新一代信息技术赋能|人才升级|产业创新
硬件入门|物联网应用实战|低功耗物联网方案部署
提升技能 尽在👇人才赋能
人才升级 推动双创事业合作
国际权威认证 技能加持合作
新基建 撬动产业数字化方案
柴火认证会员 享受诸多权益
----END----
Chaihuo x.factory|深圳,河北
在看和赞,都点这里